package com.ccovo.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.ccovo.domain.R;
import com.ccovo.domain.constants.Constants;
import com.ccovo.domain.dto.Req.LoginReq;
import com.ccovo.domain.dto.UserDTO.UserEditDTO;
import com.ccovo.domain.po.User;
import com.ccovo.domain.query.UserQuery;
import com.ccovo.enums.ErrorCode;
import com.ccovo.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@Api(tags = "权限验证接口")
@RequestMapping("/permission")
public class PermissionController {

    private final IUserService userService;

    /**
     * 获取当前账号所拥有的权限集合
     */
    @ApiOperation(value = "获取当前账号所拥有的权限集合")
    @GetMapping("/getPermissionList")
    public R<?> getPermissionList() {
        return R.ok(StpUtil.getPermissionList());
    }

    /**
     * 判断账号是否拥有指定权限,返回true/false
     */
    @ApiOperation(value = "判断账号是否拥有指定权限,返回true/false")
    @GetMapping("/hasPermission")
    public R<?> hasPermission(String permission) {
        return R.ok("当前账号是否拥有指定权限: " + StpUtil.hasPermission(permission), ErrorCode.SUCCESS.getMessage());
    }

    /**
     * 校验账号是否拥有指定权限,没有则抛出NotPermissionException
     */
    @ApiOperation(value = "校验账号是否拥有指定权限,没有则抛出NotPermissionException")
    @GetMapping("/checkPermission")
    public R<?> checkPermission(String permission) {
        StpUtil.checkPermission(permission);
        return R.ok("当前账号拥有指定权限", ErrorCode.SUCCESS.getMessage());
    }

    /**
     * 校验是否同时拥有多个指定权限
     */
    @ApiOperation(value = "校验是否同时拥有多个指定权限")
    @GetMapping("/checkPermissionAnd")
    public R<?> checkPermissionAnd(String permission1, String permission2, String permission3) {
        StpUtil.checkPermissionAnd(permission1, permission2);
        return R.ok("当前账号同时拥有指定权限", ErrorCode.SUCCESS.getMessage());
    }

    /**
     * 校验是否拥有某个指定权限
     */
    @ApiOperation(value = "校验是否拥有某个指定权限")
    @GetMapping("/checkPermissionOr")
    public R<?> checkPermissionOr(String permission1, String permission2, String permission3) {
        StpUtil.checkPermissionOr(permission1, permission2, permission3);
        return R.ok("当前账号拥有指定权限", ErrorCode.SUCCESS.getMessage());
    }

    /**
     * 获取当前账号所拥有的角色集合
     */
    @ApiOperation(value = "获取当前账号所拥有的角色集合")
    @GetMapping("/getRoleList")
    public R<?> getRoleList() {
        return R.ok(StpUtil.getRoleList());
    }

    /**
     * 判断账号是否拥有指定角色,返回true/false
     */
    @ApiOperation(value = "判断账号是否拥有指定角色,返回true/false")
    @GetMapping("/hasRole")
    public R<?> hasRole(String role) {
        return R.ok("当前账号是否拥有指定角色: " + StpUtil.hasRole(role), ErrorCode.SUCCESS.getMessage());
    }

    /**
     * 校验账号是否拥有指定角色,没有则抛出NotRoleException
     */
    @ApiOperation(value = "校验账号是否拥有指定角色,没有则抛出NotRoleException")
    @GetMapping("/checkRole")
    public R<?> checkRole(String role) {
        StpUtil.checkRole(role);
        return R.ok("当前账号拥有指定角色: " + StpUtil.getSession().get(Constants.ROLE), ErrorCode.SUCCESS.getMessage());
    }

    /**
     * 校验是否同时拥有多个指定角色
     */
    @ApiOperation(value = "校验是否同时拥有多个指定角色")
    @GetMapping("/checkRoleAnd")
    public R<?> checkRoleAnd(String role1, String role2, String role3) {
        StpUtil.checkRoleAnd(role1, role2, role3);
        return R.ok("当前账号同时拥有指定角色: " + role1 + ", " + role2 + ", " + role3, ErrorCode.SUCCESS.getMessage());
    }

    /**
     * 校验是否拥有某个指定角色
     */
    @ApiOperation(value = "校验是否拥有某个指定角色")
    @GetMapping("/checkRoleOr")
    public R<?> checkRoleOr(String role1, String role2, String role3) {
        StpUtil.checkRoleOr(role1, role2, role3);
        return R.ok("当前账号拥有指定角色: " + StpUtil.getSession().get(Constants.ROLE), ErrorCode.SUCCESS.getMessage());
    }



}
